package cn.com.ejiakanghu.web;

import cn.com.ejiakanghu.annotation.LoginUser;
import cn.com.ejiakanghu.core.utils.RespUtil;
import cn.com.ejiakanghu.core.vo.BaseResult;
import cn.com.ejiakanghu.form.CreateOrderForm;
import cn.com.ejiakanghu.form.FreightForecastForm;
import cn.com.ejiakanghu.form.WeixinSubGoodsArrivedForm;
import cn.com.ejiakanghu.service.CollectManager;
import cn.com.ejiakanghu.service.GoodsManager;
import org.apache.commons.lang.StringUtils;
import org.linlinjava.litemall.core.util.JacksonUtil;
import org.linlinjava.litemall.core.validator.Order;
import org.linlinjava.litemall.core.validator.Sort;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;


/**
 * 商品相关
 *
 * @author houzb
 * @Description
 * @create 2021-03-29 18:57
 */
@RestController
@RequestMapping("/goods")
public class GoodsController {
    /**
     * 收藏类型：商品
     */
    private Byte collectType = 0;

    @Autowired
    private GoodsManager goodsManager;
    @Autowired
    private CollectManager collectManager;

    /**
     * @api {get} /goods/detail 获取商品详情
     * @apiGroup 商品
     * @apiParam {number} id 商品id
     * @apiVersion 0.1.0
     * @apiDescription 根据商品的id获取商品信息
     * @apiSuccess {Object} Object
     * @apiSuccessExample {json} Success-Response:
     * { "msg": "成功", "code":0, "data": {} }
     */
    @RequestMapping("/detail")
    public BaseResult getGoodsDetail(@LoginUser Integer userId, @NotNull Integer id, BigDecimal lat, BigDecimal lng,Integer channel) {
        return goodsManager.detail(userId, id,channel);
    }

    /**
     * @api {get} /goods/share 分享商品
     * @apiGroup 商品
     * @apiVersion 0.1.0
     * @apiDescription 获取分享商品的信息
     * @apiSuccess {Object} Object
     * @apiSuccessExample {json} Success-Response:
     * { "msg": "成功", "code":0, "data": {} }
     */
    @RequestMapping("/share")
    public BaseResult shareGoods() {
        //TODO
        return RespUtil.success();
    }

    /**
     * @api {get} /goods/getCollect 收藏的商品
     * @apiParam {String} keyword 搜索关键字
     * @apiParam {number} page 分页获取第几页数据
     * @apiParam {number} pageSize 分页每页的数据条数
     * @apiParam {String} sort 排序字段 默认add_time
     * @apiParam {String} order 排序方向 默认desc倒叙
     * @apiGroup 商品
     * @apiVersion 0.1.0
     * @apiDescription 获取收藏的商品信息
     * @apiSuccess {int} code 请求状态码，0表示成功,其它参考状态码文档
     * @apiSuccess {String} message 结果消息说明
     * @apiSuccess {boolean} success 请求是否成功
     * @apiSuccess {Object} data 请求响应的数据
     * @apiSuccessExample {json} Success-Response:
     * {
     * "code": "请求状态码，0表示成功，其它参考状态码文档",
     * "success": "请求是否成功",
     * "timestamp": "服务器当前时间戳10位精确到秒",
     * "message": "请求成功/失败说明",
     * "data": "请求响应数据，对象或数组"
     * }
     */
    @RequestMapping("/getCollect")
    public BaseResult getCollectGoods(@LoginUser Integer userId,
                                      @RequestParam(required = false) String keyword,
                                      @RequestParam(defaultValue = "1") Integer page,
                                      @RequestParam(defaultValue = "10") Integer pageSize,
                                      @Sort @RequestParam(defaultValue = "add_time") String sort,
                                      @Order @RequestParam(defaultValue = "desc") String order) {
        return collectManager.list(userId, keyword, collectType, page, pageSize, sort, order);
    }

    /**
     * @api {get} /goods/collect 收藏商品
     * @apiParam {number} id 商品id
     * @apiGroup 商品
     * @apiVersion 0.1.0
     * @apiDescription 将商品设为收藏
     * @apiSuccess {int} code 请求状态码，0表示成功,其它参考状态码文档
     * @apiSuccess {String} message 结果消息说明
     * @apiSuccess {boolean} success 请求是否成功
     * @apiSuccess {Object} data 请求响应的数据
     * @apiSuccessExample {json} Success-Response:
     * {
     * "code": "请求状态码，0表示成功，其它参考状态码文档",
     * "success": "请求是否成功",
     * "timestamp": "服务器当前时间戳10位精确到秒",
     * "message": "请求成功/失败说明",
     * "data": "请求响应数据，对象或数组"
     * }
     */
    @RequestMapping("/collect")
    public BaseResult collectGoods(@LoginUser Integer userId, Integer id) {
        Map<String, Object> bodyMap = new HashMap<>();
        bodyMap.put("valueId", id);
        //商品
        bodyMap.put("type", collectType);
        return collectManager.add(userId, JacksonUtil.gson.toJson(bodyMap));
    }

    /**
     * @api {get} /goods/cancelCollect 取消收藏
     * @apiParam {String} id 商品id
     * @apiGroup 商品
     * @apiVersion 0.1.0
     * @apiDescription 取消收藏的商品
     * @apiSuccess {Object} Object 删除结果
     * @apiSuccess {int} code 请求状态码，0表示成功,其它参考状态码文档
     * @apiSuccess {String} message 结果消息说明
     * @apiSuccess {boolean} success 请求是否成功
     * @apiSuccess {Object} data 请求响应的数据
     * @apiSuccessExample {json} Success-Response:
     * {
     * "code": "请求状态码，0表示成功，其它参考状态码文档",
     * "success": "请求是否成功",
     * "timestamp": "服务器当前时间戳10位精确到秒",
     * "message": "请求成功/失败说明",
     * "data": "请求响应数据，对象或数组"
     * }
     */
    @RequestMapping("/cancelCollect")
    public BaseResult cancelCollect(@LoginUser Integer userId, Integer id) {
        return collectManager.delete(userId, collectType, id);
    }

    /**
     * @api {get} /goods/list 根据条件搜素商品
     * @apiParam {String} city   城市名，服务器根据城市名返回数据，不传该参数或该参数为空字符串，服务器可返回默认城市对应的数据或全国的数据
     * @apiParam {int} storeId   店铺ID，可选
     * @apiParam {int} categoryId 分类类目ID,租赁或售卖，或售卖下的具体某个类别，可选
     * @apiParam {int} brandId    品牌商ID，可选
     * @apiParam {String} goodsType   筛选商品类型，none不筛选,lease筛选租赁商品,sale筛选售卖商品,该值不传或空字符串则不进行筛选
     * @apiParam {String} keyword    关键字，可选
     * @apiParam {int} isNew      是否新品，可选
     * @apiParam {int} isHot      是否热买，可选
     * @apiParam {int} page       分页页数
     * @apiParam {int} pageSize   分页大小
     * @apiParam {String} sort    排序方式，支持"add_time", "retail_price"或"name"
     * @apiParam {String} order   排序类型，顺序(asc)或者降序(desc)
     * @apiGroup 商品
     * @apiVersion 0.1.0
     * @apiDescription 根据条件搜素商品
     * @apiSuccess {int} code 请求状态码，0表示成功,其它参考状态码文档
     * @apiSuccess {String} message 结果消息说明
     * @apiSuccess {boolean} success 请求是否成功
     * @apiSuccess {Object} data 请求响应的数据
     * @apiSuccessExample {json} Success-Response:
     *   {
     *      "code": "请求状态码，0表示成功，其它参考状态码文档",
     *      "success": "请求是否成功",
     *      "timestamp": "服务器当前时间戳10位精确到秒",
     *      "message": "请求成功/失败说明",
     *      "data": "请求响应数据，对象或数组"
     *   }
     */
    @RequestMapping("list")
    public BaseResult list(
            Integer hosId,
            Integer hosGoodsType,
            String hosLinkCode,
            Integer saleUserId,
            Integer storeId,
            Integer categoryId,
            String goodsType,
            String sortType,
            Integer brandId,
            String keyword,
            Boolean isNew,
            Boolean isHot,
            @LoginUser Integer userId,
            @RequestParam(defaultValue = "1") Integer page,
            @RequestParam(defaultValue = "10") Integer pageSize,
            @Sort(accepts = {"add_time", "counter_price", "name"}) @RequestParam(defaultValue = "add_time") String sort,
            @Order @RequestParam(defaultValue = "desc") String order) {
        if(StringUtils.isNotBlank(sortType) && !"none".equals(sortType)) {
             String[] arr = sortType.split("_");
             sort = arr[0];
             if("price".equals(sort)) {
                 sort = "counter_price";
             }
             order = arr[1];
        }
        if("none".equals(goodsType)) {
            goodsType = "";
        }

        return goodsManager.list(storeId,categoryId, goodsType, brandId, keyword, isNew, isHot, userId, page, pageSize, sort, order,hosId,hosGoodsType,hosLinkCode,saleUserId);
    }

    /**
     * @api {get} /goods/stockWarning 商品缺货提醒掌柜补货
     * @apiParam {String} id 提醒缺货的SKU规格ID，多个SKU规格ID，以英文逗号分隔，例如：10001,2002 可能表示是红色、L号的商品缺货。
     * @apiParam {String} type 提醒缺货的SKU规格类型
     * @apiGroup 商品
     * @apiVersion 0.1.0
     * @apiDescription 商品缺货提醒掌柜补货
     * @apiSuccess {int} code 请求状态码，0表示成功,其它参考状态码文档
     * @apiSuccess {String} message 结果消息说明
     * @apiSuccess {boolean} success 请求是否成功
     * @apiSuccess {Object} data 请求响应的数据
     * @apiSuccessExample {json} Success-Response:
     *  {
     *      "code": "请求状态码，0表示成功，其它参考状态码文档",
     *      "success": "请求是否成功",
     *      "timestamp": "服务器当前时间戳10位精确到秒",
     *      "message": "请求成功/失败说明",
     *      "data": "请求响应数据，对象或数组"
     *  }
     */
    @RequestMapping("stockWarning")
    public BaseResult stockWarning(String id, String type) {
        return goodsManager.stockWarning(id, type);
    }


    /**
     * @api {post} /goods/countRent 根据租期预算商品的租金
     * @apiParam {number} day  租期时长，0表示先用后付，可直接返回商品的最高租金价格
     * @apiParam {string} goodsId 租赁商品ID
     * @apiParam {string} storeId 门店id
     * @apiParam {Long} ruleId 收费模板起租期id
     * @apiGroup 商品
     * @apiVersion 0.1.0
     * @apiDescription 根据租期预算商品的租金
     * @apiSuccess {int} code 请求状态码，0表示成功,其它参考状态码文档
     * @apiSuccess {String} message 结果消息说明
     * @apiSuccess {boolean} success 请求是否成功
     * @apiSuccess {Object} data 请求响应的数据
     * @apiSuccess {number} data.rent_price 预算租金价格
     * @apiSuccessExample {json} Success-Response:
     * {
     *     "code": "请求状态码，0表示成功，其它参考状态码文档",
     *     "success": "请求是否成功",
     *     "timestamp": "服务器当前时间戳10位精确到秒",
     *     "message": "请求成功/失败说明",
     *     "data": {
     *         "price": "预算租金价格"
     *     }
     * }
     */
    @RequestMapping("countRent")
    public BaseResult countRent(@NotNull Integer goodsId, @NotNull String storeId, @NotNull Long day,@NotNull Long ruleId) {
        if(goodsId == null) {
            goodsId = 0;
        }
        BigDecimal rentPrice = goodsManager.countRent(goodsId, storeId, day,ruleId);
        Map<String,Object> data = new HashMap<>();
        data.put("price", rentPrice);
        return RespUtil.success(data);
    }

    /**
     * @api {post} /goods/getSkuInfo 获取商品SKU
     * @apiParam {number} id 商品id
     * @apiGroup 商品
     * @apiVersion 0.1.0
     * @apiDescription 获取商品SKU规格选择信息，用于在购物车直接修改商品规格
     * @apiSuccess {int} code 请求状态码，0表示成功,其它参考状态码文档
     * @apiSuccess {String} message 结果消息说明
     * @apiSuccess {boolean} success 请求是否成功
     * @apiSuccess {Object} data 请求响应的数据
     * @apiSuccessExample {json} Success-Response:
     * {
     *     "code": "请求状态码，0表示成功，其它参考状态码文档",
     *     "success": "请求是否成功",
     *     "timestamp": "服务器当前时间戳10位精确到秒",
     *     "message": "请求成功/失败说明",
     *     "data": {
     *         "goods": {
     *             "id": "商品ID",
     *             "name": "商品名称",
     *             "mian_image": "商品主图URL，图片宽高尺寸比例：320x320",
     *             "type": "商品类型",
     *             "tags": [{
     *                 "tag": "商品标签文本，例如：送货上门",
     *                 "is_red": "是否标红显示"
     *             }],
     *             "priceInfo": {
     *                 "price": "商品价格，精确到分，例如：18.00",
     *                 "suffix": "显示价格后缀，例如：/天起、/元起（可选项）",
     *                 "linePrice": "显示划线价格，精确到分，例如：22.00（可选项）",
     *                 "deposit": "商品预付金（押金/租金）价格，精确到分，例如：398.00（租赁商品必须有该参数）"
     *             },
     *             "is_offline": "商品是否已下架",
     *             "is_invalid": "商品是否已失效，商品可以看但不能购买",
     *             "is_disabled": "商品是否不支持购买，商品可以看但不能买"
     *         },
     *         "spec_list": [{
     *             "id": "规格分类ID，唯一",
     *             "name": "规格分类名称，例如：颜色、尺寸、套餐",
     *             "desc": "规格分类说明，例如：请选择您喜欢的颜色",
     *             "list": [{
     *                 "id": "规格ID，唯一",
     *                 "name": "规格名称，例如：红色、蓝色、黄色",
     *                 "image": "规格图片URL，图片宽高尺寸比例320x320"
     *             }]
     *         }],
     *         "sku_list": [{
     *             "sku_id": "SKU商品ID，唯一",
     *             "spec_ids": "SKU商品规格ID数组，例如: [1002,2002,3001]",
     *             "image": "SKU商品图片URL，图片宽高尺寸比例320x320",
     *             "stock": "SKU商品剩余库存数量",
     *             "priceInfo": {
     *                 "price": "商品价格，精确到分，例如：18.00",
     *                 "suffix": "显示价格后缀，例如：/天起、/元起（可选项）",
     *                 "linePrice": "显示划线价格，精确到分，例如：22.00（可选项）",
     *                 "deposit": "商品预付金（押金/租金）价格，精确到分，例如：398.00（租赁商品必须有该参数）"
     *             }
     *         }],
     *         "time_spec": {
     *             "id": "规格分类ID，唯一",
     *             "name": "规格分类名称，例如：租期、使用时长",
     *             "desc": "规格分类说明，例如：请选择租期",
     *             "unit": "规格分类时间单位",
     *             "min": "自定义时限制的最小值，必须大于0",
     *             "max": "自定义时限制的最大值，0表示不限制最大值",
     *             "list": [{
     *                 "len": "规格时长，0表示先用后付，对于租期应该在列表的最后一个返回0，例如：1、3、7、24、0",
     *                 "image": "规格图片，图片宽高尺寸比例320x320"
     *             }]
     *         },
     *         "custom_spec": [{
     *             "id": "规格分类ID，唯一",
     *             "name": "规格分类名称，例如：必选配件、更换配件、增加配件、上门服务、医疗保险",
     *             "desc": "规格分类说明，例如：让健康生活多一份保障",
     *             "limit": "至少选几个",
     *             "multiple": "是否允许多选",
     *             "list": [{
     *                 "id": "规格ID，唯一",
     *                 "name": "规格名称，例如：鼻吸、坐垫、10万重大疾病险、上门就诊",
     *                 "image": "规格图片URL，图片宽高尺寸比例320x320",
     *                 "price": "规格价格，该价格直接与商品价格相加",
     *                 "stock": "规格剩余库存数量"
     *             }]
     *         }],
     *         "extend_spec": [{
     *             "id": "规格分类ID，唯一",
     *             "name": "规格分类名称，例如：必选配件、更换配件、增加配件、上门服务、医疗保险",
     *             "desc": "规格分类说明，例如：让健康生活多一份保障",
     *             "limit": "至少选几个",
     *             "multiple": "是否允许多选",
     *             "list": [{
     *                 "id": "规格ID，唯一",
     *                 "name": "规格名称，例如：鼻吸、坐垫、10万重大疾病险、上门就诊",
     *                 "image": "规格图片URL，图片宽高尺寸比例320x320",
     *                 "price": "规格价格，该价格直接与商品价格相加",
     *                 "stock": "规格剩余库存数量"
     *             }]
     *         }]
     *     }
     * }
     */
    @RequestMapping("getSkuInfo")
    public BaseResult getSkuInfo(@LoginUser Integer userId, Integer id) {
        return goodsManager.getSkuInfo(userId, id);
    }

    /**
     * @api {post} /goods/isCollect 查询商品是否被当前用户收藏
     * @apiParam {String} id 商品id
     * @apiGroup 商品
     * @apiVersion 0.1.0
     * @apiDescription 查询商品是否被当前用户收藏
     * @apiSuccess {int} code 请求状态码，0表示成功,其它参考状态码文档
     * @apiSuccess {String} message 结果消息说明
     * @apiSuccess {boolean} success 请求是否成功
     * @apiSuccess {Object} data 请求响应的数据
     * @apiSuccessExample {json} Success-Response:
     * {
     * "code": "请求状态码，0表示成功，其它参考状态码文档",
     * "success": "请求是否成功",
     * "timestamp": "服务器当前时间戳10位精确到秒",
     * "message": "请求成功/失败说明",
     * "data": "请求响应数据，对象或数组"
     * }
     */
    @RequestMapping("/isCollect")
    public BaseResult isCollect(@LoginUser Integer userId, @NotNull Integer id) {
        return collectManager.isCollect(userId, id, collectType);
    }

    /**
     * 商品详情点击立即购买确认订单
     * @api {post} /goods/createOrder 商品详情点击立即购买确认订单
     * @apiGroup 购物车
     * @apiVersion 0.1.0
     * @apiParam {object} mainGoods 加入购物车的主商品
     * @apiParam {array} fitGoodsList 主商品下附加的推荐商品列表
     * @apiParam {array} packGoodsList 主商品下附加的组合打包商品列表
     * @apiParam {int} saleUserId 推广员用户ID
     * @apiDescription 商品详情点击立即购买确认订单
     * @apiSuccess {int} code 请求状态码，0表示成功,其它参考状态码文档
     * @apiSuccess {String} message 结果消息说明
     * @apiSuccess {boolean} success 请求是否成功
     * @apiSuccess {Object} data 请求响应的数据
     * @apiSuccessExample {json} Success-Response:
     * {
     * "code": "请求状态码，0表示成功，其它参考状态码文档",
     * "success": "请求是否成功",
     * "timestamp": "服务器当前时间戳10位精确到秒",
     * "message": "请求成功/失败说明",
     * "data": "请求响应数据，对象或数组"
     * }
     */
    @PostMapping("/createOrder")
    public BaseResult createOrder(@LoginUser Integer userId, @RequestBody CreateOrderForm createOrderForm) {
        return goodsManager.createOrder(userId, createOrderForm);
    }

    @PostMapping("/getHospitalList")
    public BaseResult getHospitalList(@LoginUser Integer userId, @RequestBody CreateOrderForm createOrderForm) {
        return goodsManager.getHospitalList(userId, createOrderForm);
    }

    /**
     * 获取店铺售后信息
     */
    @PostMapping("/saleReadme")
    public BaseResult saleReadme(Integer goodsId){
        return goodsManager.saleReadme(goodsId);
    }


    /**
     *  微信订阅商品到货提醒消息
     */
    @PostMapping("/weixinSubGoodsArrived")
    public BaseResult weixinSubGoodsArrived(@LoginUser Integer userId,WeixinSubGoodsArrivedForm weixinSubGoodsArrivedForm){
        return goodsManager.weixinSubGoodsArrived(userId,weixinSubGoodsArrivedForm);
    }


    /**
     * 商品运费预估
     */
    @PostMapping("/freightForecast")
    public BaseResult freightForecast(FreightForecastForm freightForecastForm){
        return goodsManager.freightForecast(freightForecastForm);
    }

}
